import json
import re

import scrapy


class JingdongscrapySpider(scrapy.Spider):
    # 爬虫名称 使用 scrapy crawl 爬虫名 启动爬虫的时候就是需要指定这个名称
    name = 'JingDongScrapy'
    # 允许爬取的域名
    allowed_domains = ['jd.com']
    # 自定义header，为了让我们的爬虫程序更像浏览器
    header = {
        ":authority": "club.jd.com",
        ":method": "GET",
        ":path": "/comment/productPageComments.action?callback=fetchJSON_comment98&productId=37245978364&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1",
        ":scheme": "https",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
        "referer": "https://item.jd.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
    }

    # 爬虫入口有两种方式指定
    # 第一种：start_urls=[链接1，链接2，链接3] 定义一个名为 start_urls 的 list，将需要爬取的网址都放进去
    # 第二种：在start_requests 这个函数中，通过手动发起 Request 来爬取数据，采取这种方式是为了可以使用自定义的header
    def start_requests(self):
        # 定义一个 url模板
        url_format = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=37245978364&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&fold=1'
        # 通过for循环构建10页 url
        for i in range(1, 11):
            url = url_format.format(i)
            # 手动发起一个 Request请求，并使用自定义 header
            yield scrapy.Request(url=url, callback=self.parse, headers=self.header)

    # 默认的解析函数，当下载器根据url把内容下载好以后，会调用parse函数 进行下一步处理，下载好的内容都在response中
    def parse(self, response):
        # id nickname content score productSize
        # 定义一个正则表达式 目的是为了去匹配json字符串
        # 为了把 包含在fetchJSON_comment98({json字符串});
        r = re.compile(r"[(](.*)[)]", re.S)
        rlist = r.findall(response.text)
        # 使用 json模块 加载 json字符串
        jsonObject = json.loads(rlist[0])
        # 根据 属性名 取值
        for comment in jsonObject["comments"]:
            id = comment["id"]
            nickname = comment["nickname"]
            content = comment["content"]
            score = comment["score"]
            productSize = comment["productSize"]
            print(id, nickname, content, score, productSize)
